package config

import (
	"flag"
	"fmt"
	"strings"
)

// Config 应用配置
type Config struct {
	Port         string
	DatabasePath string
	LogLevel     string
	SecretKey    string
}

// LoadConfig 加载配置
func LoadConfig() *Config {
	cfg := &Config{}

	flag.StringVar(&cfg.Port, "port", "80", "服务器监听端口")
	flag.StringVar(&cfg.DatabasePath, "db", "./saysay.db", "数据库文件路径")
	flag.StringVar(&cfg.LogLevel, "log", "info", "日志级别 (info|error|debug)")
	flag.StringVar(&cfg.SecretKey, "secret", "saysay-secret-key-change-in-production", "会话密钥")

	flag.Parse()

	// 确保端口号格式正确
	if !strings.HasPrefix(cfg.Port, ":") {
		cfg.Port = ":" + cfg.Port
	}

	return cfg
}

// GetAddr 获取监听地址
func (c *Config) GetAddr() string {
	return c.Port
}

// Validate 验证配置
func (c *Config) Validate() error {
	if c.Port == "" {
		return fmt.Errorf("端口不能为空")
	}

	// 验证日志级别
	validLevels := map[string]bool{
		"info":  true,
		"error": true,
		"debug": true,
	}
	if !validLevels[strings.ToLower(c.LogLevel)] {
		return fmt.Errorf("无效的日志级别: %s", c.LogLevel)
	}

	return nil
}

// Print 打印配置信息
func (c *Config) Print() {
	fmt.Println("=== 应用配置 ===")
	fmt.Printf("监听端口: %s\n", c.Port)
	fmt.Printf("数据库: %s\n", c.DatabasePath)
	fmt.Printf("日志级别: %s\n", c.LogLevel)
	fmt.Println("================")
}
